Fact-caching will eliminate the need for the following workaround, but if you are stuck in pre 1.8 ansible...
If you have a bunch of plays in a site.yml and are a big fan of --start-at-task like i am, then there is a problem if downstream plays also require gathered facts.
Having gather_facts: yes for every play slows things down.
- hosts: all
gather_facts: yes
- hosts: group1
gather_facts: no # faster not to gather_facts if we got them above
roles:
- role-that-uses-facts
But then if you start-at-task on the group1 play you don't have the facts you need.
My solution was to have the first role always gather facts for normal runs.
- hosts: zoo
gather_facts: "{{ zoo_facts | default('no')}}"
Then when debugging/developing i run with
ansible-playbook -i hosts site.yml --start-at-task="task in zoo role" -e "zoo_facts=yes"
So we can start mid run, and switch on gathering facts for that role, but normally only the first play will gather facts.