The way I do AO is very cheap.
I run the object through shadevis and store the AO value in the mesh data. Then just use this combined with the global ambient light setting.
It's really cheap so shouldn't slow you down at all. I think your bottle neck must be somewhere else unless you are doing the AO on the fly.
The only problem I have with shadevis is that it assumes the object is orientated with "up" in a specific direction. If your object is generated in a different coordinate system it goes wrong.
That's trivial to get around though.
What are those streaks on the ground? Maybe that's something to do with whatever is slowing your code :mellow: