The state of the art in collision algorithms is vertlet integration. If you're interested in highly interactive environments, a robust physics engine is important, otherwise you're forced to hard code all of the ways the player can affect the game. That isn't to say that physics (even 2d) is an easy problem.
To address your specific concerns:
Bounding Boxes
You can construct objects from a hierarchy of smaller elements. This will prevent the "standing on air" problem you can get when a rectangular bounding box is fit around a round object.
Advanced Behaviors
A robust physics engine will operate based on material properties and applied forces. This makes certain behaviors difficult to implement from a purely physical standpoint. The way I deal with it is to first separate the character animation from the collision geometry. Then, use collision information and user input to choose a proper behavior. That behavior will consist of a particular animation and the application of external forces onto the collision geometry. For example, say I've detected that the player's geometry is hitting something on the right side. I can detect that "something" is actually a ladder object. Also, I know that the player is pressing the up button. This means I will initiate the climbing animation and apply a force to the right (to keep the player on the ladder) and up (to make the player go up the ladder). To implement everything physically is overkill.
I should note that in a vertlet integration engine, displacing vertices is equivalent to applying forces. So to apply the forces described above, it would be sufficient to translate the player's bounding box so it's flush with the ladder and displace the geometry up, to apply an upward force. The engine will change the player's velocity as if a force had moved it.
Dynamic Environments
From a physics engine standpoint, if you use vertlet integration, there's no reason the environment should be handled any differently than the player. You can move vertices in either and the system will react according to the constraints you've implemented. If you're talking about AI, then yes, it's much more difficult to deal with arbitrarily changing terrain. You have no choice but to recalculate paths any time the terrain morphs.