What I am talking about is less than ideal, but a practical necessity.
It is not possible to completely rewrite every program in a suite for every release - not if you want to release on a reasonable schedule. Nor is it practical to forsee every change or addition that might be required at the initial design stage. Then there is the issue of assigning work. So programs acquire functions piecemeal, added by different people - sometimes involving quite radical changes. As this happens that program gets more and more complicated.
(Sometimes - and this IS very bad - it gets to the point where parts of the code are "off limits" for any further change - even to fix bugs).