As a bootloader, lilo wins hands down. Here is why: Lilo is designed for a single job, and it does that well. Grub on the other hand understands (some) filesystems and a bunch of other stuff that a boot loader should know nothing about (like object file formats). Lilo is “generic”, that is, you can use it to boot off pretty much any filesystem. This is a great strength.
Among other things, that means if you use software RAID or LVM or a filesystem that Grub doesn’t understand, you can’t use Grub. Lilo more or less isn’t bothered by that stuff.
Grub’s understanding of the filesystem allows it to work after you move partitions around and that sort of thing, which is considered by some to make it superior. But with Lilo, all you have to do is re-run lilo after doing such changes and it will work just as well. What’s more, it’s smaller and it doesn’t care what filesystem you’re using.
Lilo is no bigger than it needs to be. Grub is. And normally you don’t need any of the extra features that Grub provides – if you do, it’s not doing its job. Lilo is a bootloader – it loads the operating system. Grub practically is an operating system.