One of my favorite ways to do this is by combining a Bevel modifier with a SubSurf modifier.
SubSurf is great because it can't be beat in terms of smoothing out the geometry of your model. Only problem is it takes the manual addition of edge loops all along every edge you want to keep relatively sharp, which is time-consuming and difficult to edit.
If you don't add these in you get a model that looks like this:
However, if you use a Bevel modifier, with the profile set to 1, and set the Limit Method to Angle, you can almost get 100% of your edge-loops for free.
It's not entirely fool-proof though. Spots like here on the bot
So in this example it's not exactly 100% automatic, 90% of the objects you try this method on, this will get you what you need.
We just need to do two things:
Select the front face and press "I" to inset it a bit.
Then in edge select mode, go to Select>Sharp Edges. This get's us nearly all we want.
We just need to figure out a way to get these edges in there.
Which in this exact scenario we can do by using Select > Loops > Edge Loops.
And then Ctrl+E > Edge Bevel Weight and type in 1 on the numpad.
Now we have all the edges that we want beveled marked as such.
Incidentally, this is what the first versions of HardOps did way back in the day; automate this whole process to make it a 1-click deal.
Now you can just push
Ctrl+1 to add a SubSurf modifier with 1 level of subdivision, and we're looking good. Also set it to shade smooth, auto smooth and, if needed, a Weighted Normal modifier.