Performance:
Easy enough to test. If you're doing something like machine learning or big data you should really look at something that's compiled or assembled and not interpreted though; if the cycles really matter. Here are some benchmarks between the various programming languages. It looks like do-while loop is the winner on my systems using PHP with these examples.
$my_var = "some random phrase";
function fortify($my_var){
    for($x=0;isset($my_var[$x]);$x++){
        echo $my_var[$x]." ";
    }
}
function whilst($my_var){
    $x=0;
    while(isset($my_var[$x])){
       echo $my_var[$x]." ";
       $x++;
    }
}
function dowhilst($my_var){
    $x=0;
    do {
       echo $my_var[$x]." ";
       $x++;
    } while(isset($my_var[$x]));
}
function forstream(){
    for($x=0;$x<1000001;$x++){
        //simple reassignment
        $v=$x;
    }
    return "For Count to $v completed";
}
function whilestream(){
    $x=0;
    while($x<1000001){
        $v=$x;
        $x++;
    }
    return "While Count to 1000000 completed";
}
function dowhilestream(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x<1000001);
    return "Do while Count to 1000000 completed";
}
function dowhilestream2(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x!=1000001);
    return "Do while Count to 1000000 completed";
}
$array = array(
    //for the first 3, we're adding a space after every character.
        'fortify'=>$my_var,
        'whilst'=>$my_var,
        'dowhilst'=>$my_var,
   //for these we're simply counting to 1,000,000 from 0
   //assigning the value of x to v 
        'forstream'=>'',
        'whilestream'=>'',
        'dowhilestream'=>'',
   //notice how on this one the != operator is slower than
   //the < operator
        'dowhilestream2'=>''
        );
function results($array){
    foreach($array as $function=>$params){
      if(empty($params)){
        $time= microtime();
        $results = call_user_func($function);  
      } elseif(!is_array($params)){
        $time= microtime();  
        $results = call_user_func($function,$params);
      } else {
        $time= microtime();  
        $results = call_user_func_array($function,$params);
      }
      $total = number_format(microtime() - $time,10);
      echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL;
      if(!empty($results)){
          echo "<pre><code>".PHP_EOL;
          var_dump($results);
          echo PHP_EOL."</code></pre>".PHP_EOL;
      }
      echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL;
    }
}
results($array);
Criteria: while, for, and foreach are the major control structures most people use in PHP. do-while is faster than while in my tests, but largely underused in most PHP coding examples on the web.
for is count controlled, so it iterates a specific number of times; though it is slower in my own results than using a while for the same thing.
while is good when something might start out as false, so it can prevent something from ever running and wasting resources.
do-while at least once, and then until the condition returns false. It's a little faster than a while loop in my results, but it's going to run at least once.
foreach is good for iterating through an array or object. Even though you can loop through a string with a for statement using array syntax you can't use foreach to do it though in PHP.
Control Structure Nesting: It really depends on what you're doing to determine while control structure to use when nesting. In some cases like Object Oriented Programming you'll actually want to call functions that contain your control structures (individually) rather than using massive programs in procedural style that contain many nested controls. This can make it easier to read, debug, and instantiate.