this. the only way I can make profit with my web service is by using a third party low budget CDN as a caching layer. Even with that, S3 data transfer remains my biggest cost.
if I could spare the time, I'd make a custom caching layer so that S3 is never hit at all except for upload, and is used only for disaster recovery.
I haven't done the math, but depending on your bandwidth requirements - you could try spinning up a couple vms at DigitalOcean/Linode/somewhere with bundled bandwidth, and then just run nginx as a cache with s3 as the backend.