I think you miss some key things about technical debt: developer sanity, boxing yourself into bad code, and building good habits as developers. Over time, if a developer has to “live” in a codebase rife with technical debt, he/she will either develop a bad attitude because it is so unpleasant or simply stop seeing it/caring about it. It’s not great to have developers who are unhappy all the time OR happy to live in a crap hole.
Next, if you don’t address technical debt, someone is going to build on top of that nasty method or class you left lying about — maybe it will be used in 100 other places in the code — and then the effort of fixing it becomes many orders of magnitude higher than just doing it right the first place.
Finally, if developers get in the habit of “over” engineering things as you call it (aka doing it right), then they will actually be able to do the right solution as fast or faster than doing a crappy solution that won’t age well. So by being fastidious about good, clean, code, developers actually become more efficient at building good, clean code. Eventually they’d no more think of writing crappy code than most of us would think of letting our houses become like an episode of “Hoarders.”