Summary for the impatient
Disclaimer: the solution described does work for my particular circumstances. Can’t guarantee it will work for you. 🙂
Go to your device’s Settings, open Location Services (if you have them enabled; if not – you can stop reading now), scroll right to the bottom past the text describing location icons, select System Services, and disable everything that doesn’t appear to make sense to you. I left only Compass Calibration and Mobile Network Search on. I also turned on Status Bar Icon so that I can see if the phone is accessing location services for longer than feels reasonable.
Longer version with a bit of background
I discovered the System Services location services by accident. I was trying to figure out the cause of high CPU usage by hooking iPhone up to my computer and running Instruments app from Xcode, that can show you per-process CPU usage.
What I found was that locationd process was chewing up CPU. Surprised, I went into the Settings to poke around, as the location services “arrow” icon wasn’t showing up in the iPhone’s menu bar, meaning that it wasn’t an app that was using it. Sure enough, at the very bottom of the Location Services settings page, past the description of meanings of location icon variations, there was another menu which I never seen before. Open it, and I found that it was a system process that was trying to find phone’s location (can’t remember which one it was now, I think it was “Traffic”, whatever it does).
I disabled everything that didn’t make immediate sense to me, and sure enough locationd gone quiet. I also enabled Status Bar Icon for system location services, so that I can keep an eye on what I left turned on.
Turned out, it wasn’t in vain. I later found that iPhone tries to use Setting Time Zone even if it is in flight mode. Fair enough, flight mode disables radio transmitters, and GPS is a receiver, but none the less. Nice way to drain your phone’s battery if you put the phone into the flight mode rather than switch it off during a long flight.
Next up was the time to upgrade to iOS 5.1.1 a couple days ago. The upgrade went fine, but after the process has finished, I noticed that the location icon wouldn’t go away. Quick trip to the settings found that it was the system location service Mobile Network Search. I had my turned on, and wanted to keep it on, but disabling it and re-enabling woudln’t help – it got “stuck”, popping right back after I re-enabled it. Luckily, looks like I found the fix for that – I disabled the setting, rebooted the phone, and re-enabled it. Seems to have done the trick. 🙂
Anyway, hopefully this helps!