NX is able to achieve impressive performance in many cases. But still, I would say that the architecture is very bad. NX, just like X11, is based on running an Xserver on the client. An Xserver is a very complicated piece of software: It doesn't really belong in a thin client software at all. For example, to provide fonts for legacy X11 applications, you must have the fonts available on the client side. In a typical setup where NX Agent is used, the whole stack gets very complicated. See http://www.gnome.org/~markmc/a-look-at-nomachine-nx.html. And although NX works fine with well behaved applications, some applications works very bad.
VNC, on the other hand, is a much more cleaner solution, where you have only one Xserver (Xvnc), running on the server side. The protocol is truly thin. The performance is not dependent on well behaved applications. Since the protocol is so minimal, implementing clients is easy. And with the recent TurboVNC/TigerVNC developments, you can achieve amazing performance which allows usage of 3D-heavy or video applications.