То есть речь именно о плавно наращиваемом функционале. Иногда по-другому не сделаешь.
Можно ли выйти из этого порочного круга? По-моему, единственный выход -- переписывать каждый раз весь кусок программы с нуля, указав новую функциональность в ТЗ. Иначе миллиона флажков и доп переменных типа "номер итерации в пятом режиме работы" не избежать.
А вот чего следует избегать даже при таком монстре -- повторного нелогичного использования переменных. Допустим, у функции два режима работы -- расчёт для длины пружины и для скорости прокачки воды. Вот не следует делать, чтобы в режиме для пружины переменная обозначала диаметр проволоки, из которой изготовлена пружины, а в режиме для скорости прокачки воды -- эту самую скорость прокачки воды. Это утрированный пример, я его привожу для очевидности.