This is the way it likely has to be. Both of the grouping phases need to call the postFilter to return the proper results. And if the postFilter is called, the finish() needs to be called.
For expensive postFilters, this is not ideal. But, that's the implementation.
Take a look at
SOLR-5027 which was the original reason why the finish() method was added to DelegatingCollector. This an alternative to field collapsing and grouping which performs much better then ngroups and group.truncate combined.
SOLR-5027 will be getting a lot of my attention this month so any feedback you have on this would be appreciated.