What you’re seeing is JUCE doing a crazy amount of work on the CPU before passing any data to the GPU via OpenGL.
As I indicate in this post and this post, JUCE’s OpenGL wrappers approach GPU drawing by putting everything into one texture after breaking it all down into scanlines using a juce::EdgeTable
.