You've left out corner cases, and that's where the difficulty is:

-if an object is "squeezed" between two other objects and collides with both, a simple forceout/reverse-direction may cause the squeezed object to get stuck or advance very slowly in the wrong direction.

-expanding on the last one, you're hit on all sides by many objects in a single frame; how do they react? how do you react? In a naive bounce system you'll jitter; depending on how the collision boxes are untangled you may end up with objects teleporting as well.

I may still use simple bounces for my game since the environment is appropriate and I won't have very complex map structure, but it's something I might retune a few times before I'm done.

The last time I seriously worked on collision(two years ago? was in Python) I had a system with sliding, where tests against the map were done along the map's tiles; the moving objects had many test points, allowing collisions to be detected properly even with very large objects. But before I got sliding done well, I had various issues like these:

-Walking alongside walls of tiles sometimes left the player "stuck" (until they moved directly away from the wall)
-Walking into the corner of a wall exactly also left them "stuck"
-The player would get stuck on some walls but not others.

It took several days to get right, so I'm not exactly looking forward to this.