As I have learned, there are two main ways of isolating resources in AWS VPC
One through public/private subnet separation using NAT Gateways to route communications between resources (e.g. public web servers) in the public subnets and resources in the private subnets (e.g. Aurora RDS instances)
On the other hand, one could just have public subnets and all resources that should not be reachable from internet should not have public IPs and be inside Security Groups, which should only allow other resources in the public subnets to stablish connections with them
As I understand, both approaches attain the goal of impeding Internet connecting with private resources, but while NAT Gateways are quite expensive, Security Groups are available for free
So my question is, what are the security pros and cons between both approaches? Given that NAT Gateways seem to be much more popular for this purpose and Security Groups much simpler and cheaper, I would expect the former to have some kind of stronger security warranty
Until now the only "advantage" I have heard of is the possibility of forgetting the proper use of Security Groups, which I believe should not happen if one applies programming best practices to deploying infrastructure as code (e.g. Terraform, Cloudformation)