Щом не е за каквито и да било security цели (примерно генериране на random token-и, сесийни ID-та, линкове за ресет-ване на парола и т.н.), mt_rand() върши добра работа. Обикновената rand() функция наистина е LCG и както си забелязал има доста ясно изявен bias. Особено като вземеш резултатите mod някаква ниска стойност, тогава доста си личи
Ако е за security нужди и няма нужда кода да работи върху нещо различно от linux, четенето от /dev/urandom е ОК.
А иначе с mt_rand(), първоначалното seed-ване е най-скъпата операция, генерирането на последващите числа е доста по-евтино.