We run about 3 cages (~4k pieces of hardware total) for about a tenth of the cost of what we've priced out as AWS/GCP. This includes DC staff to swap/provision hardware, leases, capex, and our bandwidth contracts.
Of course, if you don't need comparable specs to an entire physical server (I do a lot of personal stuff on a t2.micro!) or don't need the same capacity 24/7, the math is very different. The cloud is definitely cost-effective for elastic workloads.
I would disagree here. You can run the metrics for your stack, but it's likely cheaper on AWS. https://awstcocalculator.com/
If you don't need to compute something but twice a day, or just certain times -- you can pay pennies on the dollar for a serverless function. There's no need for an entire server for things like this.
There's an entire other side of building a web server that devs, thankfully, never have to see. OpenCompute [1] aims to standardize what that process looks like. To think that you can run bare metal, and do better than industry standards is naive IMO.
In the end, if you're worrying more about anything than business logic, you're not really delivering value -- you're solving engineering problems. You can sacrifice that control and solving problems for greater abstractions, i.e. serverless, fargate, etc.
Unless you have some extreme security requirements (which most don't) you probably don't have a good reason to run bare metal.
[1] - http://www.opencompute.org/