I do this frequently. dd has no problem making bootable disks.
A big gotcha is that disk you're copying to, has to be as big or bigger than the one you're copying from.
Let's say you buy a Intel SSD and a Samsung SSD, and they are both 256 GB. At least that's what it says on the box.
But in reality, one is 252GB and the other is 250GB. If you're using the entire disk as your filesystem, even if there's
noithing on that filesystem, it won't work. Sometimes dd will fail with an error, but sometimes it says it completed.
If I know in advance that I may have to do this in the future at some point, I'll make the filesystem slightly smaller,
maybe 248GB or something like that. Of course if you have a bigger disk, like 512 or 1TB then it's not a problem,
the down side is, a lot of wasted disk space.
The other thing is, you can't clone a disk that you are booted from.
What I do is boot from a LiveUSB distro. ( It really doesn't matter which one, just about all of them have dd )
Use gparted or fdisk -l to find out the device names of the disks.
Then I use something like...
dd if=/dev/sdb of=/dev/sdc ibs=2G obs=2G status=progress
( change the sdb and sdc according to your needs ).
Another gotcha with dd. You don't have to do this for standard filesystem partitions,
but if you're using LVM, you can't just dd a single partition, because the device mapping on on the root/boot disk.
Finally, it has to be the "entire" disk if you're planning on booting from it.
You can't copy just from a partition, and you can't copy simply to a partition.
I do have a 2TB disk, that has 5 bootable images on it. I never boot from that disk. But it's simply my archive disk.
For that process, it's a slightly different command.
dd if=/mnt/path/to/mycustom.iso of=/dev/sda ibs=4G obs=4G status=progress