Are you making the componentContext call inside of you component? If so that's the problem. By the time your component JSP executes that opening tag has already been printed in the HTML, which is why only the closing tag is removed. To make this approach work you need to make the componentContext call before you component is included (either in the template or in the parsys).
I did wonder whether that was it, so i moved the componentContext call up a level.
In the instance where this was moved to the template, along with the <cq:include path="image" resourceType="app/components/image" /> include, this had no impact on the rendered component.
In the intance where this was moved into the parsys component, it basically wiped the closing decoration of the parsys and didn't affect the child components.
This suggests the the componentContext call does actually need to be inside the component...
Which means I can add a closing tag after each rendered component in the parsys component; create an opening tag in the component itself, with the custom class name coming from the configuration of the actual component instance...
Whilst this achieves what I want, it feels very hacky and each non-parsys component needs the IncludeOptions.getOptions(request, true).setDecorationTagName(""); explicitly called before it is included + an extra closing tag needs to exist in the parent code after the component include tag.