Sobre reescrever tudo, este artigo dá um ponto de vista interessante.
Só pra resumi-lo (mas recomendo que leia), a ideia defendida lá é que código velho não é necessariamente ruim, e código novo não garante que vai ficar melhor.
Um dos argumentos é que, por pior que seja, o código antigo possui certas características que são difíceis de reproduzir fielmente, caso sejam reescritos. Por exemplo, o código antigo já foi muito usado e testado em condições reais. Com isso, vários bugs - inclusive aqueles mais raros, que só aparecem em condições bem específicas - foram encontrados e corrigidos ao longo do tempo.
Muitas vezes aquela função com vários if
's foi o resultado desse processo: cada if
ali pode ser para arrumar um desses bugs. Poderia ter sido feito de forma melhor? Sim, talvez valha a pena refatorar apenas esta parte, quebrando a função em várias, por exemplo. Mas talvez não justifique reescrever tudo. Cada caso é um caso, tem que analisar não só a parte técnica, mas também os demais recursos: o tempo, dinheiro e as pessoas disponíveis que temos dá para refazer quanto? Mas também temos que evoluir o sistema, corrigir bugs, adicionar funcionalidades, e o prazo está apertado. Dá pra encaixar a reescrita de algumas partes nesse cronograma?
Por experiência própria, o que vejo acontecer com certa frequência é tentar encaixar pequenas melhorias e refatoramentos durante o desenvolvimento de alguma atividade. Já que vamos ter que mexer neste pedaço do código para adicionar a funcionalidade X, aproveita e refatora essa parte. Isso costuma ser mais factível e realista do que parar pra refazer tudo.