I agree with
@amalurk that in cases of serving static Wordpress pages you do not need your own server.
That is why Cloudflare is willing to serve your static HTML pages real quick globally for a small amount of money. They are basically saying "You keep your sluggish, bloated, unoptimal code on your server. We'll take only the cream from the top of a ready made cake."
A definition of a #leancompany
But it is certainly a good solution for a lot of cases where final pages are a static content. Even more if they are globally oriented. Maybe most "We have 1-5 webpages" companies should take something like that if their site is making them money.
But as you are hosting 100+ sites and want them running well, here's my take:
1) You can not buy a strong-enough CPU that will run un-cached Wordpress really fast. We have an i9-9900K for a compute unit and it takes 0.5-1.5sec TTFB on a Wordpress/Elementor site.
2) Bare metal PHP is ~10-15% faster than Linux LXC. PHP in KVM/VM is probably another step down that ladder.
3) So if you wanna provide fast Wordpress, you have to use CACHE.
It is fascinating how Wordpress is becoming a global standard CMS while telling everybody that cache is (the only) way to go if you want it to be a decent UX.
3a) As
@amalurk suggested - something like Cloudflare APO solution could be good for clients that need it. It will be $5/month/domain for "speeding it up" + you still need hosting server.
3b) A self-hosted server with FastCGI on NVMe is able to serve ~1000reqs/sec on 4 vCPU cores of a decent CPU (as presented in my test). In pure math. that translates to 86.4mio reqs/day.
This post is our real-case example of improvements utilising FastCGI. It's in Slovenian (like Melania), but benchmark results are easily understandable
Kako smo s FastCGI Cache bistveno izboljšali hitrost nalaganja Wordpress strani (Slovenia-trips.com) / Projects - Klik-MALL.com
That "before change" avg. 1.55 sec is non-cached result on i9-9900K. You can double that for most hostings.
0.37sec "after" can be achieved on much slower CPUs.
I'd go that far to say that with a good FastCGI setup you can tell your 100+ clients they do not need premium cache-ing solutions like Cloudflare APO or WP Rocket. If your bandwidth can take it they are mostly regional oriented, this will do more than fine.
CDN or Cloudflare DNS with free CDN cache of static files would be beneficiary. That is what we did with
Slotrips travel agency | Authentic Hiking, Walking & Biking Trips in Slovenia
4) If you wanna take another step further into premium wordpress service - set fastCGI, opCache and WP object cache on Redis for all clients on a shared host. They are complementary solutions. For 100+ domains it takes some resources to pull it off (if you are thinking in terms of cloud pricing and VPS-es). But for self-hosted if you are thinking Threadripper-type of a setup I think it makes a lot sense.
I am just finalizing a Managed Wordpress hosting product like this and it looks like it will be a top-notch setup with UX significantly better on front-end for visitors and also for non-cached admin part.
This is only a part of what it takes to provide solid hosting (backups, redundancy...). But if you want to run Wordpress hosting by yourself and want to provide clients with extra-mile service, this will take you very far on that path.