I was working on a prototypical asteroids game for android. The inputs were set up like a typical "twin-stick" shooter, where one stick controls movement direction, and another controls shooting direction. One trick I did though, was to have the sticks only appear when you have a finger on screen. For example, the left side of the screen(the whole side) is set for movement, and the right side is for shooting control. If a finger touches the left side, a stick appears(as a simple circle for now), and then it stays centered there, until you release the finger. The one on the right does the same, but for shooting direction. The shooting only happens if you actually have the finger down. The reason I like the whole "re-centering" thing with this, is that it doesn't matter much what the natural position of the finger is. Each player can choose what they want, and if they prefer a lower, middle, or higher section of the screen, and it is the same for both moving and shooting. Also, if the stick gets in the way of something on the screen, the player simply lifts the finger and moves it somewhere out of the way.
If I were to design a game that needs more controls, variations could be done. For example the lower-left could be dedicated to only movement. It could vary from the above system, for example the stick could be limited to left/right for a platformer. Then if you need various buttons for things, like different actions, where a single "shooting" stick doesn't cover it, you could have a set of virtual buttons over there on the right side. This type of system allows for the best of both worlds.
The biggest thing i recommend with mobile controls in games that need "virtual" controls, as in where touch based controls don't work, is that you attempt to cater to the player. In my example above, I have the control stick go wherever the player wants it to. This could also apply to the virtual keys. I've seen console emulators(GameBoy/SNES) that allow you to decide where you want a given set of the virtual buttons on screen, either via a simple "choose a corner" kind of thing, or by actually letting them drag the controls around in a configuration mode. I don't this would be too difficult to add to a game.
As far as designing controls, the reality that we are going to have to accept is this. Mobile games are not truly suited to the "hard-core" games you can do on devices with physical inputs. As such, if you could design your game for touchscreens, it may be easier to play. But the catch is that it has to actually be a touchscreen designed game. The gameplay itself has to be made that way. I couldn't play a platformer with tilt controls for movement, though a continous runner could maybe work, as indeed could the movement of an Arkanoid bat. Games have to be made with "dragging" controls, and similar things. If your game doesn't work like this, than it needs "virtual" buttons and joysticks. If you insist on forcing different inputs for a game that works best with traditional controls, then it just won't work well, and you are better of with virtual joysticks, etc...
I'm not good at it, but I've seen people play pretty hard-core type games with these virtual inputs, and it looks to me that with practice these controls for some people are almost as easy as actual physical devices(I mean as opposed to touch-screen buttons). Don't dumb down your game too much if it is supposed to be a "gamer's game" because you would be surprised at how well people actually play games on these devices.