Getting that working was crazy complicated. Basically it involved using physics to push units out from each other as it's the best push out method for crowds.
Details if I remember them correctly, it's been a while since I worked on it:
Physics is cpu intensive so I was activating and deactivating physics for each unit depending on the distance to the next closest unit.
Had two movement methods, one updated physics velocities for movement when physics was on, event driven movement when physics was off
Was going to implement path obstruction via updating the path finding collision grid, stopped working on it before that feature was implemented
Had an idea for units to take turns getting though a small passageway if going opposing directions, some units would be designed to ignore that on purpose and shove everything it could out of the way
Used path finding, stored nodes in array
Would cycle through instances and have them reevaluate if they've made progress on their path since the last check. If not, check for path again. If still no progress after some amount of time, move somewhere else.
This was pretty hard to implement and it wasn't perfect either, but it was the best I had managed.