Firefox does not use Core Animation, unlike Chrome and Safari, which causes an extra full-window blit on GPU in some cases. It also uses a transparent window, so macOS has to composite the content behind the window whenever Firefox draws. I have a patch in there to improve things, as well as a crate planeshift to help the situation with WebRender, but the patch causes some usability regressions so it has not landed. In the meantime you can set gfx.compositor.glcontext.opaque to true in about:config to get an opaque window at the cost of rounded window corners and vibrancy.
From what I've seen on the chromium bug tracker, Google has been on a ~5 year crusade to improve Mac performance. Around half the issues Ive seen include something like "We don't know what Mac does here, let's ask some people at the next conference" (these were core rendering performance bugs). I totally get why Firefox can't compete with that. It's fast on the platforms that don't seem to be hell-bent on making custom rendering slow.
"What if we stopped trying to guess what layers we need? What if we removed this boundary between painting and compositing and just went back to painting every pixel on every frame?
This may sound like a ridiculous idea, but it actually has some precedent. Modern day video games repaint every pixel, and they maintain 60 frames per second more reliably than browsers do. And they do it in an unexpected way… instead of creating these invalidation rectangles and layers to minimize what they need to paint, they just repaint the whole screen.
Wouldn’t rendering a web page like that be way slower?
If we paint on the CPU, it would be. But GPUs are designed to make this work."
https://hacks.mozilla.org/2017/10/the-whole-web-at-maximum-f...
Any modern CPU and GPU can do a lot of DMA and copying of memory in a very short amount of time, but that doesn't mean it'll be efficient wrt. power... which is what I think you were 'complaining' about?
You can feel this by playing any 3D shooter on your laptop and see the battery being sucked empty.