Previous employer, we were on WinXP and compiling a/ VS2003. Upgrade to Win7 mostly effectively crippled VS2003 for reasons I don't know. This necessitated porting our very large (100s of Millions of LOC in C++ to at least VS2008) set of in-house libraries. It should on paper be trivial, but it was a firm wide effort that spanned 18 months. Why? Because someone sent the CEO an xlsx that he couldn't open. This was circa 2007-2008. We were forced to upgrade OS and compiler for the new Office version, but it trickled into a firm wide rebuild of all C++ code. Wasnt pretty or fun.
Sometimes long upgrade cycles are great, but I suspect a yearly upgrade to the latest Visual Studio would have been a lot less painful. Fixing a few small issues is much easier than fixing many of them, and having to do it yearly both makes everyone better at doing it and better at avoiding the creation of such issues.
Being accountable for upgrading about 250k devices, we found that 3-5% of devices with questionable support status failed, as compared to near zero for supported devices. That 3-5% is unpredictable and expensive to address.
You also have to remember that Windows 10 isn’t a thing, it’s a lifestyle. Windows 10 1803 went EOL last week, and there are devices that worked with 1803 that won’t work with new builds.