I agree that NGUI's event handling isn't very well thought out.
For the purpose of sending events based on UIButton input I've created a script a long time ago which you can find in the attachments.
It allows for sending an event to a specific PlayMaker FSM on click, on press down and/or on press up and optionally sets the current GameObject in a variable of the FSM, so that you know which GameObject did send the event.
The GameObject this component is attached to needs a UIButton and Collider/Collider2D component set as trigger (you might need to adjust some parameters on the UICamera in your scene so that it registers event on Collider's instead of RigidBody's and set it to be a 2D UI Camera - or one of the other options, I don't accurately remember).
I haven't tested it in a while but it should still work, as it's just using the default MonoBehavior functions for registering click events, but which also works on UIButton's.