Down that path lies passing 60 parameters to constructors and grotesque contortions just to avoid using a global here and there. All of your code because harder to read, harder to understand, and harder to maintain.
You're comparing using global variables, to... writing terrible, terrible code....
How about you don't use globals, and *gasp*, also don't write terrible code?
Your OS syscalls are, for all intents and purposes, services/singletons.
And they provide a service to the EXE as a whole / their mutable state is owned by the EXE as a whole, so they don't have a choice but to be global (to the exe).
Development services such as a logger can argued to fit into the same category, so can get away with using global state.
Almost everything in a game code-base, does not fit into that category... and no, the alternative is not grotesque contortions and passing 60 parameters everywhere...
I am seriously tired of dealing with the cognitive overhead of dependency injection frameworks
I've also seen some pretty terrible global service locator frameworks. The problem there is bloated frameworks and bad "architects"