There are a few approaches that can be taken. If you want to stick with basic Vim functionality, you can do something like
:%s/[uU]ser/\=submatch(0) ==# 'user' ? 'person' : 'Person'/g
If you have Vim built with Perl bindings, you can make use of :perldo
. Depending on the length of the matching/replacing words and where the case you want to preserve is, this may or may not work.
:perldo s/(user)/"\L$1" ^ $1 ^ 'person'/ieg
Or you can make use of one of the various scripts that implement such functionality.