Firstly you can use caching for product page html though it’s not the actual solution I think. For caching you can you the following code in ShowProducts.aspx.cs before final output.
HttpContext.Current.Cache.Insert(CacheName, m_PageOutput, null, DateTime.Now.AddMinutes(AppLogic.CacheDurationMinutes()), TimeSpan.Zero);
Secondly as per your research,
Minicart will load for every page and default minicart control use the same AspDotNetStorefrontControls.ShoppingCartControl and AspDotNetStorefrontControls.ShoppingCartLineItemDescriptionControl controls. Please debug these two classes and make sure which query or objects takes the maximum time.
Please let me know if my suggestion not working for you. Meanwhile I will try to find more specific possible reasons.