why ipairs does exist when one can do a for loop from 1 to #t?
Historical reasons. It almost got removed and got put back due to public outcry. The main reason is because it makes the iterator syntax more consistent.
why the _ipairs metamethod was deprecated?
Because there's no need for a metamethod for something as simple as ipairs() and if you want different iteration behavior you should just provide a different iterator.
/s/ Adam