Now see THAT'S probably it. Mine does start off at the beginning once the room starts, but I didn't think they needed the pathfind only once in a while. Wait, what about for an action game where they consistently follow you? Wouldn't that be an issue?
Also 50 enemies is nice and all, but I was hoping more for at least 250 max...
No that's fine. I think while the pathfinding is probably whats making your code so slow, really the issue is how you're thinking about your AI.
My current project (A Day In Valhalla) is a hack-n-slash action game so the requirements from the AI are probably pretty similar to what you need.
Essentially the key thing in my opinion is splitting out your decision making code (path finding for example) from the code that performs the action (like following a path). The code for moving/following a path of course needs to be ran every step, but the code for generating a path only really needs to be ran every now and then for them to convincingly follow the player.
By putting all decision making code into an alarm that triggers every so often, this also gives you enemies a convincing reaction time to changing situations, which in my opinion actually feels better and more realistic from a gameplay perspective. It gives enemies a nice reaction time.
You can vary how often you run the decision making code from enemy type to enemy type to give them differing reaction times. My goblins run it fairly in frequently as they are dim witted and so are naturally slow to react, other enemies do it much more frequently however.
As for number of enemies, while I've not tested it (my game design is more focused on around 20 max enemies at a time) I'm fairly certain it could easily handle 100+ and still run well on all but the most potato of machines. If you want really big groups of enemies however then you would want to look at other optimisations for that. You can group clusters of enemies when they're close to each other and have them all use a single path for example.