Pipeline stall creating wait states can have performance issues. Function call/ if conditions.
Functions need to execute, bouncing from physics to graphics create stalls waiting to handle the next function.
Based on the information, Individual objects are then spread all over memory, update code cycling physics, graphics and logic.
I am curious of the function calls on your map before and after AI placement, a similar form of DOD is an option or as suggested above optimize your code/map to suit how the index handles. Removing references in the index can cause dangling pointer issues so keep that in mind.
Also, for those interested (entitybank\Characters) MaskedSoldier.X is 2,425 kb at 6040 frames compared to Rocket Man.X at 10,180 kb, at 6714 frames. Character Creator civilian1.X body model and animation is 6,100 kb and lists at 27335 frames.
Below is an example of randomly placed object design, compared to organizing data placement then design.
Using one folder of Entities, Cityscape. two Different AI model x5 each = 10, no spawns, random location placement.
Also including 2 dynamic barrels x10+ and two of these barrels set to AlwaysActive. Vsync off to give an example in small scene.
First image. AI placed every 5-10 entities during map build. 35k polys, AI referencing is high resulting in low frames.
Second image, AI placed first, dynamic entities and then static. 39k polys (I went a little bigger by mistake) similar location, physics is higher, more polys in scene, draw calls are slightly up and higher frames. This is a single test result, though 10 frames can be a lot if dipping below 60.