I think the best time not to use singletons is when something needs its own separate instance, like per-player data, or when it isn’t really a “manager” or "controller" that controls global logic.
Example: in a multiplayer game, you might have an InventoryManager (singleton) that deals with the overall logic of adding/removing items and handling references. But each player’s actual inventory should not be a singleton, because every player needs their own instance of it.
So I kind of look at it like this:
The core logic (stuff that only makes sense to exist once) = singleton.
The things that use that logic or represent individual entities = not singletons.
It’s also true that you could technically make everything a singleton and still make it work, but that usually just makes things messy and manage from my experience.
Sorry, I find it difficult to explain about the concepts, but I just know when to use them. It comes naturally eventually hehe!
Hope this reply is helpful.