copy_ still does backprop from x_copy to x (as you can see with x_copy.grad_fn being CopyBackwards)
detach() is opposite, and probably does what you want (x - trainable graph branch, x_copy - auxiliary non-trainable w.r.t. x)
clone() in addition to detach() is only nessesary if detached branch does inplace operations on x_copy, otherwise any operation, e.g. x.detach() * z allocates new memory and initial cloning has no effect