Gathering facts acquires less facts than the setup module

Does anyone know if there is a distinct difference between running the setup module on a host and the automatic gathering facts module?
The documents say that they are both the same thing but when I look at the facts that the gathering step found it has a large amount of facts missing that the setup module by itself can find.

For example, I am using ansible_processor_cores. I can find this on all of our Solaris hosts using the setup module

[root@hostname ~]# ansible -m setup remote_host | grep ansible_processor_cores
“ansible_processor_cores”: 16,

Yet when running a playbook I either get variable undefined, or if I have a lower precedent variable (vars file etc.) it will go back to that value.

Weirdly the playbook can find that fact on Solaris LDOMs but not control domains, despite it being available to the setup module on both. Am I missing something or is the gathering facts tasks not doing what is supposed to?

Some facts create conflicts, so they don't get injected as 'top level
variables', look inside the `ansible_facts` variable for 'all facts'.
When using it from 'adhoc' you are looking at the raw output of the
plugin vs what is registered at the top level inside ansible, that is
probably why you see a discrepancy.

You can even disable 'top level fact vars'
https://docs.ansible.com/ansible/2.5/reference_appendices/config.html
which would make them all disappear as variables, but they are always
available under the `ansible_facts` variable.