No, you need to panic if the future is polled too much, because doing so is a safe operation. async blocks do the same kind of thing, panicking when polled again after completion, and tracking this state in a tag similar to how Option works.
Regarding your edit: I would leave this panicking instead of a silent no-op. If you don't like the non-specific unwrap, you could use expect("future resumed after completion") instead of unwrap, but panicking is very expected behavior of what a future does if polled again after returning Poll::Ready). Every async fn and every async block would do the same (i. e. panic) in this situation.