In theory there is absolutely nothing wrong with singletons.
In practice singletons become God objects where hack upon hack upon hack is placed.
Eventually to modify a program in a safe way you end up needing to understand the entire program because everything depends on the singleton and the singleton depends on everything else.
Singletons like writing an entire program using only global vars are a tradeoff, you tradeoff maintainability and design for performance and ease of (initial) implementation.
In the long term maintainability is usually more important than performance and ease of initial implementation.
In practice singletons become God objects where hack upon hack upon hack is placed.
Eventually to modify a program in a safe way you end up needing to understand the entire program because everything depends on the singleton and the singleton depends on everything else.
Singletons like writing an entire program using only global vars are a tradeoff, you tradeoff maintainability and design for performance and ease of (initial) implementation.
In the long term maintainability is usually more important than performance and ease of initial implementation.