Is OnGUI efficient?

If I understand it correctly OnGUI is called every frame. Let’s say I display statistics in OnGUI (like health points or kills). Does it mean Unity gets the variables (kills) every frame and paints them? Wouldn’t a much better idea be to print several stats only when they change (redraw when we kill something)? Doesn’t OnGUI take a lot of unnecessary power (well, it’s not a lot, but still it’s a waste of resources)? Also GUI.Button doesn’t have on hover event, which we need to write ourselves. Isn’t it a better idea to write our own GUI without the Unitis one.

You only need to worry about this kind of thing when the profiler tells you that your OnGUI function is consuming the most amount of time. It’s unlikely to be the case.

OnGUI is called multiple times per frame, that’s right! If you don’t want to waste your resources (even if it is not a problem) try to setup a second camera only with your GUI elements (and don’t use OnGUI with it, only textures, texts, etc. in the Update function).
However Unity 4.6 is almost here with a totally new GUI concept:

and Unity 4.6 RC1