いつプログラムは書き直すべきであるか、もしくは書き直さずにメンテナンスするか

 バグがない、もしくは十分に少ないプログラムであれば、メンテナンス性の向上のために少しずつリファクタリングしてゆく方が良い。一応動いてるけどバグだらけでコードも目も当てられない、というようなプログラムの場合は、思い切って描き直した方が良い。
 設計時点では要求仕様に沿った設計になってたけど、(社会のニーズなどにあわせ)要求仕様が設計と解離してしまった場合はどうなのだろう。あまりに新しい設計とコードがかけはなれている場合は、もともと別のソフトウェアであって、従って書き直した方が良い、ような気がするが、一般的にそう言い切れるものだろうか。