My player uses 8 direction, while the enemies mostly use a combination of MoveTo and custom movement. I have custom movement to "bounce" the enemies off one another when they're clustered together, and that works fine. I can't use the same thing with the tilemap though, because I have to set a direction for the bounce - usually I use angle (SolidObject.X, SolidObject.Y, Enemy.X, Enemy.Y), which won't work with the tilemap since its X and Y are at 0,0 (or some fixed coordinate anyway). If I could somehow return the coordinates of the point of collision with the tilemap, that might work, but I'm not sure how.
To be honest, movement and AI's always one of my biggest headaches
I don't like using push out solid at all if I can help it - it tends to lead to janky, glitchy movement - but it's the only way I can see that'll make sure the enemies don't go clipping into the tilemap.