It's overly general, really, to talk about "Opportunities" alone.
Opportunities are one level away from leads in Marketo (as in most CRMs): they have a many-to-many relationship with leads and will not show up at the lead level unless there is at least one row in the Opportunity Role cross-reference (junction) table to bind the Lead table and Opportunity table together. Oppty Roles and Oppties have separate REST API endpoints. When you view an Opportunity via the Marketo UI or via Velocity, you're seeing a synthetic view that comprises both tables, with some fields taken from each table (for example, the Role is in the Opportunity Role table, while the Description is in the Opportunity table).
What I think you're driving at w/r/t the marketoGUID not being "exposed" is that you don't see it in the Marketo UI (nor, sometimes just as important, do you see it in the Velocity scripting context). This is unfortunately true, but what I've done to work around it is append the externalOpportunityId to the name of the Opportunity, so it shows in the UI:

You could do the same with the marketoGUID upon Opportunity creation, but it takes an extra API call that way.
I don't know what you mean by "sync everything through our SQL database" but you're going to be writing your own middleware, i.e. integration tier, to get this done. And that's a fine and often advisable project, but you shouldn't confuse it with not having middleware.