It's a little rough around the edges, but it will do, if Git::Repository is unavailable.
Little oddities:
After instantiating with Git->repository(...), you can fetch the $GIT_DIR and $GIT_WORK_TREE using:
$GIT_DIR — $repo->repo_path()
$GIT_WORK_TREE — $repo->wc_path()
BUT note that this will still be set in bare repos! I guess you have to detect bare repos by comparing the $GIT_DIR and $GIT_WORK_TREE to see if they're [almost] the same? Very weird.
Is it Windows-compatible at all? All path-manipulation seems to be done using string-concatenation, rather than using File::Spec or similar.