It would appear that, at least for Ubuntu's service provider detection, a combination of /run/systemd/system existence and a version check are done.
Technically speaking, the version check is unnecessary, in that if systemd is detected (which /run/systemd/system is sufficient for), then no version check should be done. This way patches aren't necessary forever to puppet as systemd is the default going forward in Ubuntu releases.
Ideally, the pseudo-logic would be "if systemd is detected then use the systemd provider; else if upstart is suitable, use the upstart provider; else use the init provider", I think. That is, upstart shouldn't be used at all if systemd is detected. We are seeing a bug in the Ubuntu packages on upgrade from 14.04 -> 16.04 where the 'upstart' package is installed (so e.g., /sbin/start is present and the upstart service provider is suitable), but systemd is running – our version of puppet is a bit older in 16.04 (3.8.5) and that didn't have ubuntu listed as a potential systemd provider target. We are patching our shipped version of puppet to include that change, but from a code maintenance perspective, there are probably some improvements that can be done upstream.