I tried an experiment where I gave the bots a bunch of random-ish input to select from (different turn speeds, forward/left/jump/etc. randomly pressed), tested each one, then picked the fastest one. This was the result.
On the plus side, it allowed the bots to sort of dynamically figure out mediocre-average strafe jumping paths dynamically. On the minus side, it's extremely CPU intensive. I was noticing significant framerate hits with just 4 bots.
Of course, things could be done to optimize this, but depending on the obstacles in the map, the dynamic strafe jumping may or may not be effective without doing lots of actual physics casts (slow!).
I think, for now, I'm going to focus on using player recorded positions and paths, but try to make the bots follow them in a more dynamic manner.