JFrame's don't create their insets until after I pack the canvas on it, whereas Frames have them created when they're made. That's created a new and confusing problem with setting a maximized window. Here's the code I now use to figure out how much room I have to draw on for my game:
Rectangle bounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
Insets insets = frame.getInsets();
bounds.getHeight() - insets.top + insets.bottom
GAME_WIDTH = canvas.getWidth();
GAME_HEIGHT = canvas.getHeight();
And now everything works dandy, and it appears that with the JFrame change, both Windowed and Fullscreen modes are accelerated and now Fullscreen is SLIGHLTY faster for me than windowed mode. Neat!
Thank you oNyx for your direction