You are correct in thinking that drawscreen should be called after you've finished plotting everything for the frame. It does a bit of setup and waits until the screen finishes drawing which is where your delay might be.
I think what might be actually happening is that the rest of your code takes slightly too long so that the 7800 is already drawing the next frame before drawscreen is called, so drawscreen would have to wait for the screen to finish, wait for vblank to finish, and then continue at the start of the NEXT frame.
A strategy to make the most of the time you have on each frame is to have all of your logic at the start of your loop, then restore the screen, then do all your plotting, then drawscreen. What you don't want to do is have anything graphics related near the start because 7800BASIC will wait for the screen to finish drawing before making changes to prevent the display being scrambled while it's being drawn, meaning all your code has to finish within the small amount of time that vblank takes.
For example, if your drawplayer routine does anything not directly related to drawing then that code can be run earlier in the loop during the visible screen time leaving just the plotting to be done between frames.
Edited by SmittyB, Mon Sep 24, 2018 2:48 PM.