There can be many ways to expose content from AEM as JSON
Manipulate/filter infinity.json to provide required JSON
Write a custom servlet, which reads JCR and exposes required JSON
Content as a service - new feature being provided in AEM 6.3. There doesn't seems to b much official (Develop/Administer/Author) documentation on this. Is there a role of Content Fragments and Experience Fragments (not sure of difference between 2 yet)
Has anyone evaluated different options? What is the difference between CaaS and Sling Model Exporters? If there are some reference links which help us understand and evaluate different options please share experiences.
There is quite a bit of information on Sling Models in that link.
If you want complete control over which nodes are exposed - you can write a custom service using JCR API and then convert the result set to JSON. This would be manual coding.
Adobe is probably trying to reuse feature provided by Sling instead of reinventing the wheel, also focusing on providing headless capabilities to cater to different channels/type of apps. I guess the future would be headless capabilities to support SPA etc.