real time
Looking at the signed message, the reason gets very obvious. gpg --list-packets takes the input and lists all packets contained in a somewhat readable fashion:
$ echo "foo" | gpg --sign | gpg --list-packets
[gpg asking for passphrase]
:compressed packet: algo=1
:onepass_sig packet: keyid 8E78E44DFB1B55E9
version 3, sigclass 0x00, digest 2, pubkey 1, last=1
:literal data packet:
mode b (62), created 1421012528, name="",
raw data: 4 bytes
:signature packet: algo 1, keyid 8E78E44DFB1B55E9
version 4, created 1421012528, md5len 0, sigclass 0x00
digest algo 2, begin of digest 96 e3
hashed subpkt 2 len 4 (sig created 2015-01-11)
subpkt 16 len 8 (issuer key ID 8E78E44DFB1B55E9)
data: [4096 bits]
The "literal data packet" and also the "signature packet" contain the creation timestamp, here 1421012528. The actual signature data also takes the literal data packet's creation timestamp into account, thus will also be different for every signature calculated.
faketime
To verify this, use the glorious faketime program and calculate the checksum of the signature (which is always the same, no matter how often you run the command):
faketime 5pm /bin/bash -c "echo "foo" | gpg --sign | sha256sum"