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.