Como outros observaram, acertar na primeira vez é obviamente mais barato. Mas eu também apontaria que qualquer construto de programação cai em algum lugar do espectro do padrão anti-padrão. Você está implementando algo de maneira ordenada ou não; O código infestado 'goto' segue um padrão, é apenas algo que foi reconhecido desde o início como potencialmente prejudicial. Mas observe que todo o código se resume a saltos e ramificações em algum momento do ciclo de compilação. Não há nada de errado em pular: isso acaba dificultando a compreensão de projetos maiores.
É fácil ser enganado por padrões que parecem triviais para casos de uso simples. Assim que você começar a precisar de mais flexibilidade, a maioria dos padrões quebradiços degenerará em antipadrões. Portanto, minha regra é escrever apenas código que eu possa entender e ter uma chance razoável de depuração. Se eu decidir aplicar um padrão inteligente às cegas, tenho que ser pelo menos tão inteligente quanto o código do padrão para depurá-lo. Portanto, a chave é apenas garantir que você isole e utilize padrões que se apliquem diretamente diretamente ao seu problema, que esteja abordando o problema no nível adequado de abstração e que possa entender e depurar todas as linhas do seu código.
Uma chave aqui é encontrar o equilíbrio certo entre os requisitos de curto e longo prazo. Lembre-se de que escrever um bom código rapidamente é algo que certamente pode ajudar a partir de padrões bem compreendidos - o código de espaguete pode parecer mais rápido, especialmente no início. Mas você verá rapidamente as limitações dos antipadrões em qualquer projeto maior, onde a decomposição, a modularidade etc. se tornam incrivelmente importantes.