I presume that the new harddisk is NOT exactly the same model as the old one (that is, doesn't have the same disk size and geometry, heads, cylinders,...). If it is, and only then, the easiest is to make a true image dump, that is, a block-by-block copy of the whole thing.
dd if=/dev/hda of=/dev/hdb bs=16K
would do the trick. That'll take a night or so. I use that on occasion for new machines with the same disk. Since it's a low-level block by block copy, the result is bootable again.
But usually the disks are not the same (you buy two Maxtors two months apart, and they are different). In that case, get a bootable CD (e.g. from my very own
http://www.phenix.bnl.gov/~purschke/RescueCD/ project, which outlines a task like yours in rough stitches. It has all the utils you need).
Make the NEW disk /dev/hda (or whatever it will be later when it boots), important. Boot from the CD. Make partitions and file systems matching the ones on the old disk. Mount the matching partitons one by one, and tar or cp -a the contents over. It's a good moment to review the space allocations of the partitions and give, say, a bit more to /usr if you need. After this, you have a (not yet bootable) copy of your old disk.
Now mount the partition that has the /etc/ and /boot directory (to get at the kernel and lilo.conf), say the mount point is /ndisk, then do
lilo -r /ndisk
and you are done. In order for that to work, the disk must already have its eventual identity (usual as /dev/hda). Before you reboot, don't forget to umount the mounted partitions.
Though a bit more complicated, it's actually a lot faster than the dd method (if you could use it in the first place) since you only copy the actual data and not the whole disk, block by block.
This is also the way I make full system backups; I tar all partitions to a backup. In case of a disaster, I redo the disk with the same method except that the source is not the existing disk but the tar files.
Good luck,
Martin