It is not bad practice to use self-signed certificates. Self-signed certificates have a lot of practical purposes for which it simply doesn't make sense to use a CA-signed certificate.
For example, on many of my servers, I have passwordless login set up. These are servers that I connect to so frequently, and sometimes keep multiple SSH connections open to, that it's a hassle to type in my username and password every single time.
Instead, I use a self-signed SSL certificate that I generate on each of my client machines (a workstation at the office, a laptop, and my home workstation). This sort of setup allows me to use fairly long, secure, and completely unique passphrases for each of my servers without affecting productivity. And because I have direct access to the servers where I can install the public key for each certificate, there's no point in me using a CA-signed certificate.
I could set up my own root CA with which I can sign all of the internal-use certificates for our company, and this way I would only need to install a single public key on each server. However, our organization hasn't grown to the size that really necessitates this, and for the purposes of secure HTTP, this would still be the same as having a self-signed certificate.
Likewise, self-signed certificates are frequently used for email connections, PGP signature, and server-to-server connections where it's trivial to pre-exchange public keys. In many of these cases, this is actually more secure than relying on a certificate chain which could be compromised at any point in the chain.