Using your own GameInstance class derived from UGameInstance is the way to go to create that “singleton” like class for your project. This is how I did it on my first UE4 project, and when I went to work for another studio, what do you know, this is also what they did!
The GameInstance class as 2 functions you can override that will be useful in your case of creating and managing your game “managers”:
virtual void Init() override;
virtual void Shutdown() override;
As for the managers themselves, it depends on what you need them to do, but I would say that 90% of the time, you should just make it derive from UObject.
Hope this helps and good luck with your project.