I stripped it back to a simple project with circles again and fiddled with it and I think the fundamental issue is that it relies on gently massaging speed and angle values. This is amazing as a physics/particle simulation but not so suitable as a collision avoidance system for enemies that have to move toward a target directly.
Using a static value for speed and vectoring so the sprites move directly towards the target, rather than are steered towards them seems to not work with this model without causing overlaps, even at low values.
I will keep tinkering though and see if I can get it to work.
EDIT: I think that the grid pair system struggles to deal with resulting overlaps when things are being forced to move to a location. It's possible that adding in prediction by giving the spatialgrid access to each objects x and y velocities and rechecking for future overlaps would work but it would probably move the performance way back.
https://1drv.ms/u/s!AkmrWgxeuxlKhKMx9yWgRSvmR0j70g?e=sU32mH