There are a few things to understand first. There are different stages of testing like Unit testing, End to End testing, performance testing etc. These tests either run on the browser (that means end user) or they run in your code. These tests require a runner for executing. Some examples of runners are Karma, Protractor, mocha-cli, jest etc. Not all of these runners are compatible with all types of testing.
Protractor runs end to end tests and it can use frameworks like jasmine, mocha and cucumber. But protractor runs these tests on the browser so we require a browser to run these tests. This cannot be achieved with mocha-cli out of the box because it does not have browser support, but it can be achieved if the runner was configured to use a browser instance. Protractor supports the above three BDD testing frameworks.
Karma/jest/mocha-cli runs unit tests on your system code. This runner does not require a browser to run the tests as the tests would run on the internal system code and no http requests would be involved. Karma still requires a browser to view the test results as a UI element.
For performance testing with lighthouse, you can start your browser and use jest to run the tests as a zero configuration test runner. But this would require you to create a browser instance.
Bottomline is that testing frameworks are different than test runners. Mocha developed its own test runner to provide light weight unit testing runner for testing code. A framework is used as a testing support structure where you can place your tests systematically to achieve a goal. Whereas a runner is something that does not care what framework your tests are running (till they are compatible with the runner). The runner will just pick up all the tests it finds and execute them.