The fact that having every script have its own Update() function vs having a single Update() in a manager that calls child updates has been like that since Unity's inception. It wasn't a secret, there just wasn't a blog post about it. It's the same about all functions. There is overhead every time C++ to C# boundary is crossed. Once you're in C#, it's faster to stay there if at all possible.
I tried it before but realistically there was little noticeable difference in performance and there were odd side-effects related to going from play mode to edit mode that were fixed by using Update() in widgets. Also note that if things are not visible you should keep their game objects disabled anyway, implying their Update() won't run.
If you want to go with the reduced Update() just to try it out, you can try it yourself easily enough in 2 simple steps:
1. Rename UIRect.Update() to UIRect.CustomUpdate().
2. Add this function to UIPanel:
void Update ()
{
for (int i = 0, imax = widgets.Count; i < imax; ++i)
if (widgets[i].panel == this) widgets[i].CustomUpdate();
}
P.S. As for ETC1 stuff... that will never happen. Android is just one platform. NGUI needs to work on all of them.