To me the behavior is unexpected from a user perspective. It may be the design intent, but this would require a response from the developer.
The answer form Bobby Singh is the correct approach given the design of puppeteer Browser class; The usage of puppeteer.launch without args (headless to be specific promises a Browser instance without a blank page, requires awaiting Browser.newPage() in order to Page.goto(url) and subsequent commands; whereas, when declaring headless (whether false or true) the Browser instance promised already has a page loaded. Thus the next natural call for many common to Page.goto(url) opens a second page.
In my experience this causes confusion and was unexpected behavior bordering on a bug. For example, I found that opening a browser with a page in one instance but without a page in another, interfered with timing of further Puppeteer commands.
I once implemented a routine to puppeteer.launch() with no args, then await Browser.newPage(), then page.goto(url), then page.focus(some element). Every thing was working fine, then I wanted to add a debug option, to toggle headless mode. To achieve this I added the headless argument to the original launch(call). Now my session ended up with two pages instead of one. This interfered with the page.focus and subsequent commands on the second page that launched.
The resolution is that if you want to specify headless false or true, you can take the approach of using browser.pages without browser.newPage() but if you don't specify headless, you need to instantiate with Browser.newPage()