_draw() is a virtual function that is overridden. It is executed at a very specific time during the frame, because this is right before the rendering takes place.
When using a
yield() it returns execution and everything is rendered. Returning anytime after this function happens wouldn't be meaningful, the frame has already been rendered and moved on.
The backend timing is guarded by that error, which makes the program flow not consistent with what is typical in GDScript.
If you want to manipulate the points being drawn over time you will want to hold the points in an Array/Dictionary elsewhere, and modify them with
yield(), timers, processing loops, and later call
update() (Which queues
_draw() to be called in the script).
The implementation of
_draw() should then loop through the points that are available at that particular point in time.
A simple example below of an expected implementation, where a point disappears every second.
extends Node2D # v3.2.4
var pts = 
for i in 50:
pts.append(Vector2(randf() * 500.0, randf() * 500.0))
var t = 0.0
func _physics_process(delta: float) -> void:
t += delta
if( t >= 1.0):
t -= 1.0
func _draw() -> void:
for pt in pts:
draw_circle(pt, 3.0, Color.red)