The hard jaw of your vise should be rigid enough to offer a consistent zero plane from which to reference your workpiece location. If not, there is something wrong with the vise, vise setup, or you are not tightening it consistently from part to part. Once this is sorted out, your Y-axis should be considered taken care of. Any number of stops can be employed to establish zero on the X-axis. I typically use one of the small parallel clamps that straddles the hard jaw and locks into place by tightening a socket head cap screw. Once affixed, it takes some serious, localized force to move. The more robust stops that clamp to the table T-slots are good options, as well. The Z-axis is most usually controlled by use of the vise's base rails, a set of parallels, or some play on the 1-2-3 block, depending upon the size of your part. I've also used multiple grinding vises clamped in the mill vise after being accurately set up on the surface plate, which works really well if you have several matched grinding vises and a skilled operator setting them up for you as you do the machining.
Another consideration is asking what level of precision are you trying to achieve? A setup reaching for a +/-.010" tolerance can be approached much differently than one requiring +/-.0005", of course. I enjoy striving for a tolerance of zero in my work. The number on the print is what I intend to hit but in the manufacturing environment, this is neither reasonable, cost effective, nor long tolerated. Think of the print tolerance as defining the scope of your setup, and do just a bit more than the minimum to achieve this goal.
When doing high-precision work on the mill, there are two methods I use pretty regularly. One involves the small jaw clamp mentioned above and my Indicol (
https://www.anytimesale.com/INDICOL-178-UNIVERSAL-INDICATOR-HOLDER-p/204590.htm ) to sweep each part an verify zero. This arrangement easily locates parts to within .0005" with a bit of care and patience. Using the jaw stop gets my next part located very close to where it needs to be and saves a lot of sweeping and futzing around with table movement. It goes pretty quick once you get the hang of it and provides plenty of accuracy for most applications. This ideally used when your part zero is off the centerline of your part, as is usually the case when working in a mold shop or similar environment.
The other option is similar to the above but will precisely locate your CORNER zero. The Indicol holder is again used, but I swap out the jaw stop for one of the table mounted versions and set the stop pin down low on the part so it's out of the way of what's about to happen up near the top. Using a device I've always heard referred to as a "toolmaker's chair" as shown here:
http://www.swissprec.com/cgi/ISSRIT2?pmaka=98-337-9&pmctlg=01� Mine is slightly different and there are several different styles, but you can see what's going on with this one. These are precision ground and locate to the edge of your workpiece using very strong magnets. With this model, sweeping the hole at top will give you a true corner zero with minimal fuss. Again, it goes pretty quick once you get the hang of it.