If you invoke File::Find::find() with the no_chdir=>1 option, $_ and $File::Find::name have the same value. Use local $_=$_; in the "wanted" callback and you can modify it as you like.
Just remove the unwanted prefix instead of matching the entire name (unless you want to untaint), and use different RE quotes to avoid the leaning toothpick syndrom: s|^C:/users/User/Music/||i;
Save the path in a variable, pass that to File::Find::find(), and use the variable in the substitution using quotemeta: s|^\Q$path\E||i;
Your code lacks a check for a successful open, and it uses the "ancient" two-argument open: open OUT,'>','filename.txt' or die "Can't open filename.txt: $!";
If you would redirect STDOUT when invoking the script, you don't have to work with OUT and open() at all. That would also allow to pipe the output into another program.
If you want to list only files, test for files inside the callback, before modifying $_: return unless -f $_;
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)