Looks like they both operate on the same thing (the CV*) to me
Yes - when you descend to that level they become very similar, indeed :-)
So the question is why does Perl and your function use different tests to determine the same thing?
Good question. My approach won't work on perl-5.6.2, so perhaps history and portability might be part of the explanation. But there could, of course, be other reasons. (I couldn't even get correct results on perl-5.6.2 with CvROOT and CvXSUB.)