You are right in that
31 c0 xor %eax, %eax
is shorter than b8 00 00 00 00 mov $0, %eax
but that's not the main reason it's often used in shellcode. The xor reg, reg is preferred because it means the resulting shellcode will not contain a null byte. This is desirable since the null-byte is often used as a string terminator, in environment variables for example.