You can increase performance further by marking certain panels as static, indicating that widgets inside will not change their size/color/position changes. This will cut down on some checks, improving performance.
If you're clever, you can actually enable the "static" by default, but turn it off when you believe your panel will need to be changing. For example -- when you click on a button. You can then turn it on again in the next frame.
Checking "static" may not be applicable in most case. At least, we have to turn off "static" property to use button roll over effect.
Turning on/off "static" dynamically make codes more complex.
Why don't you just relying on dynamic batching? By doing that, you can also make 1 drawcall without performance drop.
UIpanel's geometry building architecture has nothing better than dynamic batching.
I really like component based structure and functionality of NGUI.
I actually moved to NGUI from EZGUI.
But after some test, I can't understand why you chose this architecture...