Short answer: To play a sound from point A to point B, nothing beats play~. You just tell it, "start ".
Long answer: If you must use groove~, you need to provide a stopping command at the right moment somehow. As you have no doubt noticed, the loopend attribute of groove~ causes the sound to loop back to the loopstart point if looping is on, but lets the sound continue if looping is off, so it's not really of that much use to you. You can send groove~ a start time, then send it a "stop" message some amount of time later. Or you can set its rate signal to 0 to stop it. Or you can use the sync signal (the signal coming out of the right outlet of groove~) to tell you when the loopend point has been reached, and use that to stop listening to groove~ (set its amplitude to 0). See the examples below. (The last solution is the worst, since it delays your playback and end time by one signal vector, which may or may not be noticeable.)
Thanks for the clear insights. I'm making a beat slicer/reshuffler and mainly want to be able to play a specific part of a sample (probably with a speed-control) so it looks like play~ is the object for me in this case.