But I don't want the overhead of pupeteerI don't understand this objection. Puppeteer is the client library that you want, and it's not particularly massive. It's the plumbing to handle all of the stuff around starting and connecting to browsers, providing a tidy API to abstract the stuff that's annoying to use directly.
In fact, you can do almost anything you want to using the existing interface that Chrome has built in:
chromium --remote-debugging-port=9222
You can connect to it using e.g. the WS command line tool using the URL it spits out:
ws ws://127.0.0.1:9222/devtools/browser/81b9b178-ece0-4953-8ea0-bce6ac31d89c
Then you can make it do things:
{"id": 1, "method": "Target.createTarget", "params": {"url": "http://www.google.com"}}
It does what you want, over a web socket interface rather than HTTP.