Some hope: not sure how many these solutions might apply to, and yes, do them at your own risk, but I've had some improvement.
So I've had the same problem here in India where my iPhone 5 tries to hang on to the real-low 3G signal, making itself unavailable to make/receive any calls and not switching to 2G either. When I visited the carrier's (Airtel) customer-service-centre, they took a look at my SIM which is old and said that it was a 64K SIM and that replacing it with a 128K SIM will surely improve the signal quality a little (20%, they said confidently). And so I did. So, over the day today, my phone did have much better signal overall - and that in 2G. So, if it this issue is really bothering you, like it did me, do get this checked.
Also, another option is to play around with the "Carrier" in Settings: if you know what your carrier's 2G appears as, turn off "Automatic" and select it manually.
Non-scientific, but for either/both of these reasons, my signal was better today overall.
PS: If you wonder how simply doubling the storage on the SIM can improve signal, there does seem to be some connection: google it. I am not sure what mobile algorithms involve this storage, but as a system programmer, I know that systems/devices can always do more with more memory resources.
PPS: I just installed an app called, OpenSignal: give it a shot, bunch of (related) interesting things in it.
HTH.