Sling dynamic include is your best choice if only some part of the page is dynamic but if the whole page is generated dynamically, you can look into thread/heap dumps and increase CPU/Memory based on the results.
If you are using queries with AEM repository, start looking at indexing.
Look at the rest calls you make to backend systems from AEM. Try to analyze if there is any latency with backend rest call responses. Configure http max parallel connections and time outs for the back end rest calls.
Other way is to call the rest api directly from client js code with bypassing the request to go through AEM.