Well, afaik the culling doesn’t remove it from the scenegraph and so, doesn’t avoid the controls added to the spatial to be executed, it only avoids it to be rendered (and so, to be sent to the graphics card), while detaching it from the scenegraph means to fully remove that spatial (from logical and visual space).
So, with culling it, the updateControl still working in controls but no renderUpdate, while detaching it both stops working.
In modern JME, if the spatial has no controls then updateControl() is never called on the spatial. There was an optimization some time back that rolls this up to the root node and we only update Spatials that need it.
There is some small overhead to leaving the spatial in the scene graph. There is also overhead to attaching it and detaching it (bounding shape recalculation, etc.)
Which one is better largely depends on how memory constrained you are, how long it will be visible versus invisible, how often that state will change, etc…
My general rule of thumb for the obvious cases:
If it’s gone and may never come back then detach it.
If it’s gone but will definitely be right back in a few frames then set the cull hint.
Those gray areas in the middle then mostly depend on how far it leans one way or the other and what makes for simpler code in the particular use-case.