Well, you've given the 3 best reasons I can think of that would go into answering your question. It comes down to the answers that only you can give to those questions.
My approach has been to have a "mini" API in each of our clients sites for "their" stuff, and our "main" API that becomes a reposititory of common, or important functions that extend beyond "just theirs". They're all built on the same foundation, so it's quite easy to switch and trade them around as necessary.
Also, by encoding the results as json, we're able to return many, many data items in a single call (whole tables of columns all at once if need be). I'd recommend looking at ReSTLER, by Luracast, if you want to see who they do it - it's a nice starting point.
EDIT showing very simnple multi-value return:
if(is_array($result)) {
echo json_encode(array_values($result));
}else{
echo json_encode($result);
}
Using Luracast ReSTLer, this code will return everything that PHPInfo contains in a single call:
ob_start();
phpinfo($module);
$info_arr = array();
$info_lines = explode("
", strip_tags(ob_get_clean(), "<tr><td><h2>"));
$cat = "General";
foreach($info_lines as $line)
{
preg_match("~<h2>(.*)</h2>~", $line, $title) ? $cat = $title[1] : null;
if(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$info_arr[$cat][$val[1]] = $val[2];
}
elseif(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$info_arr[$cat][$val[1]] = array("local" => $val[2], "master" => $val[3]);
}
}
return Utilities::arrayToObject($info_arr);