Small shops, in my experience, have more time and labor available than money

When a developer costs the company $100+/hour, it's hard to justify paying him/her to manage a database when you can pay AWS $50/month to do it.... and AWS will almost always do it better than a developer will do in his/her spare time.

The bigger your scale, the stronger the argument becomes to not use cloud.

Sure, very large companies may find it more cost effective to own their own hardware and datacenters, but there's a huge number of comapnies where self-hosting makes no sense. I know someone at a company that pays nearly $1M/month to AWS -- the company has about 50 developers and 2 ops staff to manage the entire compute infrastructure, their server count varies throughout the day depending on customer demand from around 1000 overnight to 8000 servers during peak daytime usage. Their peak lasts from 6am - 6pm, so most servers would be unused for 12 hours a day. They've got about a petabyte of storage in AWS S3.

But, since you're focused on pricing for bare metal vs AWS, let's look at some pricing that's loosely based on a company I used to work for. (this company took data from customers, ran monthly processing and returned aggregated data to customers,so nearly all bandwidth was inbound)

A Dell R530 with a 20 Thread CPU, 4x16GB RAM and 4TB SSD disk (RAID-1 so 2TB usable) is around $8500, or around $275/month for a 3 year lease. You can rent 1U in a reliable coloc for $200 (including network port + basic firewall services), so you're looking at $575/month.

This is roughly equivalent to 4 m4.xlarge's ($0.086/hour each at 3 year reserved pricing) and 2TB SSD EBS disk ($200/month) or around $450/month. Add in a TB of outbound data for $100, so that's $550/month.

Sounds pretty comparable... oh, but you want redundancy, if your machine (or data center) goes up in flames, you don't want to lose your service, so add in another hardware server + fees, so you're paying over $1000/month.

Depending on your need for redundancy, with Amazon you may be fine with an ASG with health check that restarts your server if it fails. Or you can spread your servers across data centers. Or you keep cold spares in another AZ or region that you launch once a day to sync disks so you're only paying for 5 minutes/day of usage)

So that covers base load. So now, at the end of the month your customers have been sending you data, and they expect you to process it and send aggregated reports back to them within 3 days of the end of the month. You don't have enough spare CPU/memory on your existing servers (even if you use your spare server) to do this month-end processing with existing hardware, so you spin up 4 i3.8xlarge's (32 core, 244GB CPU, 8TB local SSD) at $2.50/hour for 32 hours, or $320 for all 4.

Each of those is bigger than the R530's you're using, but let's say pricing is the same, so you're paying another $1000/month to lease servers you're only using 2 days a month.

And now your service grows and you want to expand capacity. If you own the servers, you need to buy new ones and pay someone to rack and configure them and migrate your applications. While with AWS you just do a quick stop/start and suddenly you're running on a bigger server.

This cloud scaling is only useful if your credit card can handle 50x the charges

If you can't pay for your infrastructure it doesn't matter whether you're on cloud servers or not.