This is a question that comes up pretty often. If I recall, using custom movement push out solids is a pretty common solution, as well as applying physics to the objects in question. R0j0hound also had a nice SAT implementation that works well on circular objects.
Otherwise, a low cost solution some people utilize is to actually allow overlap during movement, and then have them push each other out of the way upon reaching the destination (StarCraft zerglings).
Generally speaking there is no easy quick answer for this as far as I know. Even StarCraft had trouble with dragon/Goliath pathfinding and collisions.