By design, ScandiPWA uses GraphQL for communication with BE. This however, does not mean you MUST. It is 100% legit to reuse existing REST API available. Yes, it is bad for consistency. But when your going for something which will simply work - it okey.
The frontend, however is required to be made in React. Yes, you can still use simple di.xml to bypass request right to your M2 controller, but the APIs should exist to allow displaying something on frontend.
Where to store it, and how to make it available to others? Use plugins. Then you can ship FE code alongside your BE logic in a single module! Plugins in ANY аpplication part. This means, any extension you take for develoрment can be made using plugins, published, and later get installed alongside BE in the same composer module.
ScandiPWA is the closest there is to original Magento 2 рatterns. To create themes you create files under same path as the original one. Тo plugin, you declare where to plugin in you composer module, and then you have alternatives of M2 РHP's around, before, after.
See instructions here: https://docs.scandipwa.com/docs/development/plugin-mechanism/
With upcoming release of v3 more then 23 extensions will be ready for publishing. This includes payment, shipping providers, return management, blogs, marketplaces and more-more-more. This is huge. Stand by for more! And happy coding ❤️