Hi Samualeth
Your right, VBO's on the iPhone don't really make much difference as there is no real dedicated video memory to copy the data too. The key behind the VBO is putting the data as close to the GPU as possible making it easier to keep it fed with information. Whilst the current iPhone models don't really have this concept, I believe through rumours that future devices could make use of dedicated video memory. Using VBO's would automatically allow your game to make use of that feature if it was ever released.
When it comes to rendering to a texture, that is actually restrictive. Rendering all layers to a single texture would not allow me to make changes each frame without re-rendering the texture. Also the map I am using in Sir Lamorak's Quest is 40k tiles square and is 8000x8000 pixels. The largest texture you can have on the iPhone is 1024x1024 so I would need multiple textures requiring them to be bound and therefore introducing state changes.
When I create the VBO for a tile layer, it is at that point that I work out the vertices locations for each tile. From that point on I don't change those vertices ever, I simply perform a glTranslate on the world coordinates based on where the player is in relation to the map and also render the other game objects as well. I then pop the matrix before the glTranslate and render the GUI.
As the VBO data is never changed from when it is created I mark the VBOs as GL_STATIC_DRAW which tells OpenGL ES that the contents of the VBO will never change, as apposed to GL_DYNAMIC_DRAW. This helps OpenGL ES optimise how it stores/accesses the data in the VBO. As you say, not a massive advantage if any, but its clean and will make use of any new features in that area Apple introduce later

. Whether using VBOs or Interleaved Vertex Arrays, it does mean I only ever calculate the vertices of all the tiles on a map layer once and then never change them. OpenGL ES can process this data an insane speeds as well.
I have played with moving from GL_TRIANGLES as well to using a GL_TRIANGLE_STRIP, but I have problems with the degenerate triangles needed to move from the end of one strip to the start of another without actually drawing any triangles. The performance improvement I was seeing would suggest that this method would be a HUGE advantage, so something I will continue to play with layer

Your right about the coordinates, it does seem better to statically render objects and then move the world around them. That becomes a problem though when you are batching up your rendering. When rendering a batch of vertices its not possible to change the world coordinates until that batch has completed. So for things like the baddies etc I do update their vertices each frame and put them all into an Interleaved Vertex Array which is again rendered as a single batch. For everything other than the tile map I have a single large texture for all entities including animation etc, so I can render an entire scene using just two textures which helps keep the state changes down as well.
The render loop is pseudo code looks like this:
- Clear the screen
- push the matrix
- glTranslate to the players location keeping the player in the middle of the screen
- render the castles base layer (no blending)
- render the castles objects layer (with blending)
- render the axe
- render the player
- render entities (baddies)
- render the doors
- render the transportation portals
- Render the current batch i.e. everything above except the map layers that use VBOs
- pop the matrix
- render the HUD graphics
- Render the current batch
Hope that helps. I think these discussions are excellent as it does make you think about how you have implemented stuff

Mike