Yeah, it was replaced by a "safer" alternative gets_s which takes a size parameter.
I have to disagree with your initial assessment regarding gets() being as unsafe as strcpy() is. You can never, ever allocate enough memory to make gets() a safe call (other then perhaps all available memory on the system so there would be no more memory for the user to continue inputting.. hmm that's an interesting theory in fact!)
Whereas strcpy() can easily be made "safe" by simply ensuring you allocate enough bytes to copy into.
Code:
char * s;
char buf[] = "some string blah blah";
if ( s = calloc( sizeof buf , sizeof *s) )
strcpy(s,buf);
/* or the more likely */
...
if ( s = calloc( strlen(someotherstringptr)+1 ,sizeof *s) )
strcpy(s,someotherstringptr);