Isn't that true for pretty much every OS? The feature set we need to be able to do our jobs and computing hobbies have been available for two decades.
Operating systems like Debian is sufficiently boring that I can just upgrade and continue computing. macOS upgrades have become a small gamble, the stuff that I depend on may not continue to work, or at least it will take a good deal of work. There are however no reason to upgrade, so the risk isn't really worth the hassle of upgrading and breaking Java or Python.
Microsoft still manages to do 'cool stuff' at the kernel level; IO Rings, VBS, Rust, etc.
Only thing I see on the Apple' what's new that looks interesting is Metal updates. Most of the rest is UI.
You can still get software that installs and works perfectly on Windows 7 (released 16 years ago). Good luck finding software that even installs on Snow Leopard (released 16 years ago), let alone works well.
The flip side of this is that every attempt at advancing the Windows UI framework story beyond win32/MFC and WPF has failed and the platform itself is steeped neck deep in technical debt.
You can't blame this all on backwards compatibility. Microsoft can't just stick to one successor technology and keeps obsoleting every attempt after a few years. With that approach, of course no one is going to move over.
That’s one issue, but another is that they don’t make into successors full replacements. They’ve stuck to WinAppSDK aka WinUI for a while now, but it’s missing such basic elements as a datagrid/tableview which makes it difficult to take seriously as a desktop UI framework.
Also, they didn't even migrate their own internal dialogs with each replacement. You can still uncover dialog styles all the way back to Windows 95-style if you poke around Windows 11 long enough. Whenever they came out with yet another successor, they haphazardly migrated a handful of P1 components and then called it a day.
Snow leopard is a unix based os. There is a ton of software that can still install on it and work fine.
I mean OS updates are necessary, from security updates to support for new hardware. Stuff like init scripts were a suboptimal solution to begin with, it is not like that old stuff was a good solution. Xorg also doesn't fit how modern computers work, and is merely a collection of bandaids that is inherently unable to reach sane security by todays standards. So its not like progress is entirely superficial. And also with Flatpak there has emerged a way of shipping stuff such that used libraries can be shared but do not have to be, and every app can move at its own pace without conflicting with other apps or the OS. So at least in Linux land, especially in the last couple years, there has been great advances from a technical point of view. And those tackle also the problems arising when a huge number of indipendent parts come together, which were naturally very pronounced for Linux in the past.