TL DR: As a rule, when developing C ++ or C, it is better to avoid unnecessary visible headers.
Is there a better way to do this?
This is usually a very bad idea when your project is small. Most sources should not see the declaration of most files, but these are high-level objects. At least categorize it.
Does it slow down compilation time?
Generally yes. Example. Do you know most of the source files about the user interface library? Probably not.
Is this the best solution?
Yes. The cost of direct declarations is very low.
Also, I know that there is something called precompiled headers, but it has never been used. Perhaps this is the solution to my problem and something that I should learn?
For some builds, they can save a lot of time. For others, they can only slow down. If you decide to use them, then measure the build time to confirm what is best for your project and includes what you need.
As a rule, you will find that all your sources should not know about something very high and big (for example, in the graphical interface and in the abstraction layer). Only part of the sources usually need to know about these higher-level libraries. This is often a good time to break up your codebase into smaller objects / libraries.
... and summarize all the questions. What would you do in my place?
I would not collect all of these high-level libraries / headers in the header for viewing by all sources. It hurts to undo in large codebases and is usually expensive on the build path. Headings containing forward declarations are good.