lp vs lpr. What to use in case of CUPS and what historical difference?

LPR is part of the original BSD printing system. It was fairly simple and straightforward, but it didn't have all the management capabilities that large print environments wanted. You could hack it to do all sorts of things by shoving filters in the right place, but it was pretty kludgy. It also included a very limited network functionality allowing you to send jobs to a remote printer, but since the protocol was only designed with plain text in mind, it never really had provisions for determining types of documents and translating them to what the printer could understand. Ad-hoc workarounds helped. Since the network protocol was so simple, lots and lots of network printers support it.

System V designed a bigger system which allowed you to have things like printer classes, and a print job would go to the first free printer in the class. (For example, if you had a machine room with three printers.) It also tried to build in more formalized support for filters and things like that, but alas, it's also really, really old and not really designed for networked environments.

Nowadays, nobody really uses either system. CUPS has taken over the print systems, but it offers the command line tools for both lpr and SYSV printing (lp). That's just for compatibility. You can use either command you find easiest.