I'm going to reply to my own question, in case someone else has the same questions, or in the more likely event that I dont' remember what I did, and need to look it up.
1) There is a better way to draw stuff in game. That's to use the Python Imaging Library to dynamically create a PNG on the fly, then write that to disk, then use that for the sprite. This gives you both better drawing tools and better performance.
For example, a city has many buildings, lets say 20. Before I would draw out the building with ColorLayers and add them all to the City sprite. The problem is now you have 20 images for one sprite. With the new method you draw the buildings out in PIL, write it to disk, and add THAT to the City sprite. Allows for flexibility and performance.
2, 4) Obviously, you cannot have an infinite layer of infinite objects. I think (I still have to implment this) you can have a primitive type of frustrum culling where you pop the sprite onto the scrolling layer as it becomes visible (using the relative distances (point_to_world method) between the Cities and the Cloud). Having an object in memory and NOT adding it to a node or layer makes a huge performance difference. This should have been obvious to me.
Other Notes:
I couldn't just keep the Cloud on one layer, and the scrolling layer on the other, I was having trouble with getting collisions right. So I just put them on the same layer, and scrolled the land one way, and the cloud the other, making the cloud look like it was staying still, and making it easier to find the coordinates of the City/Forests/Whatever and the cloud.
A Bug I Couldn't Figure Out:
I wanted to rotate the world around the cloud. The problem is that I'm rotating the entire world, but the rotation point stays still. So as I move away from the initial starting point, the rotation angle becomes larger, and just doesn't behave as it would if the rotation point was centered on the middle of the screen.
Hope this helps someone in the future.