My understanding is that regarding the interface to OpenStack nova, the difference is trivial. For example, a KVM hypervisor has additional support to PIT, RTC, HPET timers, etc. Most of the logics at the OpenStack layer are the same when using either hypervisor.
The difference lies in the underlying hypervisor used by libvirt. If you specify 'qemu' as the hypervisor, you can run your VM in emulation mode, which was QEMU originally designed for. If you choose 'kvm', you explicitly require a hardware supported virtualization from the processor. It should perform much faster than 'qemu'. However, according to some documents, 'kvm' has a back track to 'qemu' mode if the hardware doesn't support virtualization extenstions.