You can also force iMessage to send as text while it is in the waiting to be delivered phase (i.e., no "Delivered" status yet). When I don't see the "Delivered" status within a few seconds or so I tap the message bubble and choose to send as text message.
This causes iMessage to send as SMS right away, without waiting for the usual waiting period, which is like 5 minutes or so. It also seems to "remember" that you forced it to send as SMS so if you send another message it is automatically sent as SMS. But if the other party responds back with an iMessage, your next message will be iMessage too.
One of the problems I find happening is that wifi will have an issue with Internet connectivity, which causes iMessage to fail--even though there was a perfectly good 3G connection that could have been used instead. Example of this would be someone who is just leaving work or home and the iPhone hangs onto a WiFi connection that is no longer actually working (out of range). Or someone has perhaps automatically connected to a known wifi network but they have not yet agreed to the agree-to-terms popup (like at a Starbucks). I wish iOS would not assume being connected to wifi equals having internet access. It would be better if it only used wifi if it verified there was also internet access--and if not use 3G.
Michael