The only real difference between my existing code and what you are proposing is to call gx_widget_detach() rather than gx_widget_delete().
This seems like a very bad idea.
gx_widget_delete() removes dirty list entries for the widget, stops any timers owned by the widget and removes any events from the event queue that are destined for the widget.
As far as I can tell, gx_widget_detach() does none of these functions.
I don't know what the zombie widget will do when it receives timer events or any other events for that matter.
I suppose this code will eliminate the Hard Fault I get since it will never call _gx_system_event_remove() but I don't know what other weirdness it may cause.