Rendering on the iPhone is always VBL synced at 60 fps. If your normal rendering code cannot run in less than 16ms then you will end up dropping frames. If it consistently takes between 16ms and 32ms to run your game loop, you will end up running at 30fps exactly. Are you using Cocos2D? I seem to recall people saying that there was code in Cocos 2D that would limit the framerate to 30fps if you couldn't keep 60fps presumably to prioritize smoothness over speed.
I suppose I should be more clear what I meant by "terrain rendering". In that game, each line segment had several fins extruded off of it in order to draw the grass or rock border. We never got far enough to optimize that and just drew all of the terrain every frame. Just drawing a simple line for the terrain instead of several thousand triangles got us from 30-40fps up to a solid 60fps.
One thing to note about using shark is that it tells you where you are spending the CPU time, but not how much time your program spends waiting for things like VBL sync, sleeping threads or IO. You should also look at the total CPU load to figure that out. If your program isn't using a high percentage of the CPU time, then it's doing a lot of waiting.