I've been pretty much upgrading my own desktop PC regularly since the 90s (though I did buy a brand new one 6 years ago).
In my experience the upgrade that's more likelly to improve it the cheapest is RAM, then a graphics card if you're a gamer.
Upgrading the CPU has always been something that happens less often and also it doesn't help that the CPU can only be upgrade up to a point without having to replace the motherboard (which then forces replacing the RAM and possibly even the PC box).
However there were two transition periods were the best upgrade by far was something else: the first was back in the day when hardware 3D accelerator boards were invented (Quake with a 3dfx was night and day compared to software rendering) and the other one was the transition for HDD to SSD, both being massive jumps in performance.
At times that shit is pretty much the opposite of what should be done.
Fail Fast is generally a much better way to handle certain risks, especially those around parts of the code which have certain expectations and the code upstream calling it (or even other systems sending it data) gets changed and breaks those expectations: it's much better to just get "BAAM, error + stack trace" the first time you run the code with those upstream changes than have stuff silently fail to work properly and you only find out about it when the database in Production starts getting junk stored in certain fields or some other high impact problem.
You don't want to silently suppress error reporting unless the errors are expected and properly dealt with as part of the process (say, network errors), you want to actually have the code validate early certain things coming in from the outside (be it other code or, even more importantly, other systems) for meeting certain expectations (say, check that a list of things which should never be empty is in fact not empty) and immediatly complain about it.
I've lost count how many times following this strategy has saved me from a small stupid bug (sometimes not even in my system) snowballing into something much worse because of the code silently ignoring that something is not as it's supposed to be.