That's quite a philosophical debate actually
What is the "best" when you have a solid product which is selling, and you recompile it with GCC v n+1 and it no longer runs. You may have to spend loads of time on a) finding out why and b) regression testing a potentially large project. It is extremely poor business risk management! The correct way is to freeze the tools version some considerable time before the product is released.
In depends on what you are developing. In my world... Tool chains have security vulnerabilities. It is not uncommon for the toolchain (and build infrastructure) to be shared between many projects and they are usually upgraded, with warning, when vulnerabilities are raised. If a particular project runs into issues with the new toolchain, there is usually a way to manually configure an "exceptional" toolchain config. This will however give the project an "Out of compliance" flag which is summarised to management weekly. You can't stay out of compliance without higher and higher up approvals as time goes on.
Even AFTER release when a vulnerability is discovered in either the app code or the toolchain/libraries a new release is created within 2 weeks (or more out of compliance).
Now lets say that you "own" project A. Project A, it's tool chain and it's libraries are squeaky clean. However, you depend on Project B's service. Project B has red flags and needs to do a release. You need to test your project against their new release (or they do!). You can then encounter "breaking changes" and start into negotiations, but usually end up fixing it on yourside if they have a more upto date release.
I mean, not all software has an active and frequent release cycle. Not all software or toolchain output is affected by security vuls.
I have a Casio calculator that has the same firmware it had back in 1994. It still works. I have not checked Casio's errata on it, but I would imagine there have been bugs found, but due to the vintage, there is no way to fix them, other than returning them to the factor to replace the blob IC.
A lot of embedded projects have so little external influences they have a tiny security surface area to consider. So old stale releases with bugs are fine.
We talked about this before. A large part of embedded software is now working on the modern "agile, constant release" project cadence. This is what causes all those pesky "Update Available" for firmware in modern 'IoT' eco-systems. Hell even if you use an Arduino and depend on a board file and a lib, they get updated frequently too!
The "Maintenance" phase of the software life cycle is not one you can simply ignore. Depending on how long a life the software has the "Maintenance" and "Support" phase is usually the most expensive bit.
EDIT: Also, in my world, we have quite a lot of processes, techniques, tools and prior work to lean on when it comes to testing. Most projects slowly grow in automation. In the first instance of an upgrade in shared dependencies or toolchians, the pipeline will automatically build, run the unit tests, check the code for smells and even in some setups run the full end2end integration tests automatically and produce a report. If all that comes back green, then the only thing you need is a pre-prod sanity check when it's deployed, to sign it off for PROD.