Disagree. I don't keep crappy code just because "it works", this is how you build house of cards, i do have comments in old projects a la "do not move this statement around" or "don't remove this variable" and that is 99.9% crappy design on me (again, i was inexperienced in both C and development in general back then), or things cobbled together, or incremental additions without any structure. it may be working, but it's shit code. Almost all my projects over time have been refactored, or rewritten from the ground up, and it's much, much, much easier to add new features without the castle falling down.
We do have projects from before my time which are frozen, and a series of comments at the beginning which state what to change to go from behaviour X to Y. They are still there because old applications that we can't or don't want to properly test so they stay as it it, but i refuse to touch. Most projects were like this, it was a mess. One of the things i did is make a parameter out of everything that made sense, and make it programmable so it was ONE firmware i had to keep updating instead of managing, say, ten, times X for every project. That was the spawn of the "don't change anything" mentality which was actually incremental builds with lack of planning, don't look at it wrong or it won't work.
Some times i do find actual compiler bugs (which get reported, then fixed in the following release) so whenever there is an update i run my tests on some projects, measure the changes, see if the bugs have been effectively solved, and then i update. Every update in the compiler is a breath of fresh air because better diagnostic and/or better code generation, and i get to remove the workarounds that ultimately would become shit code