Where they get you is that it very rarely makes financial sense to do both cloud and colo/on-prem (unless you're a massive company). It ends up being way more expensive to use the cloud, but also hire engineers to work on making an on-prem cloud. Most companies have a mixed bag of projects that are either better served by the cloud, or are okay with colo and the savings it can bring.

Assuming you don't want to do a hybrid approach, then you either push everyone onto the cloud and accept paying more, or you push everyone into colo and force the small and scaling out projects to deal with stuff like having to order hardware 3 months in advance.

Then, depending on how nice you want it to be to interact with your infrastructure, you can end up paying a lot to have people build abstractions over it. Do you want developers to be able to create their own database from a merge request or API call? If so, now you're going to have to hire someone with a 6 figure salary to figure out how to do that. It's easy to forget how many things are involved in that. You're going to have a lot of databases, so you need a system to track them. A lot of these databases are presumably not big enough to warrant a full physical server, so you have to sort out multi-tenancy. If you have multi-tenancy, you need a way to handle RBAC so one user can't bork all the databases on the host. You will also need some way to handle what happens when one user is throwing so much load at the RDBMS it's impacting other apps on that database. To accomplish that, you're going to need a way to gather metrics that are sharded per-database and a way to monitor those (which is admittedly one of the easier bits). You also generally just straight up lose a lot of the scaling features. I don't have a way to just give you more IOPS to your database on-prem. The best I can do is add more disks, but your database will be down for a long time if I have to put a disk in, expand the RAID, let it redistribute data and then power it back up. That's several hours of downtime for you, along with anyone who's on the same database. Of course, we can do replicas, and swap the master, but everyone will have to reconfigure their apps or we need something like Consul to handle that (which means more engineers to manage that stuff).

You're also probably going to need more than one of those expensive infra people, because they presumably need an on-call rotation, and no one is going to agree to be on-call the time. And every time someone quits, you have to train the new person, which is several months of salary basically wasted.

That's not to say that you don't need infra people on AWS, but you a) need a lot less of them, because they only need to manage the systems AWS has, not build them, and b) you can hire cheaper ops people, again because you don't need people that are capable of building those kinds of systems.

Once you factor in all of that stuff, AWS' prices start looking more reasonable. They're still a little higher, but they're not double the price. If anything more than a tiny, tiny subset of the AWS features are appealing, it's going to cost you almost as much to build your own as it does to just pay Amazon/Google/Microsoft/whoever.

Also, a massive thing people overlook is that AWS is fairly well documented. I can Google exactly how to set up permissions on an S3 bucket, or how to use an S3 bucket as a website. It only takes seconds, the cognitive burden is low, and the low-friction doesn't cause anyone stress. In-house systems tend to be poorly documented, and doing anything slightly outside the norm becomes a "set up a meeting with the infra team" kind of thing. It takes forever, but more importantly, it takes a lot of thought and it's frustrating.