You can use Blend Shapes for this, which would allow you to account for possibly animation problems in your modeling tool rather than further down the workflow, but if you want
Finer Control
Identify the regions you want to morph and assign weights to each vertex within those regions so that your modifications can taper off. That part is no different from regular vertex weighting for animation.

Next, you'll define the transformation matrix that will be applied to each vertex, where the minimum would be the identity matrix.
class BlendTarget
{
public Vector3 Translation;
public Quaternion Rotation;
public Vector3 Scale;
// The "center" of the transformation - used for rotation/scaling
public Vector3 Origin;
// Vertex indices to modify
public int[] Indices;
// Amount to modify the vertex - from 0 to 1
public float[] Weights;
public Matrix4x4 Matrix
{
get { return Matrix4x4.TRS(Translation, Rotation, Scale); }
}
Such that, for each vertex in your predefined region:
public void Apply(Mesh baseMesh, Mesh meshResult, float amount)
{
if (baseMesh == null)
throw new ArgumentNullException("baseMesh");
if (meshResult == null)
throw new ArgumentNullException("meshResult");
var identity = Matrix4x4.identity;
var morphTarget = Matrix;
// Matrix applied overall, weighted by "amount"
morphTarget = MatrixLerp(ref identity, ref morphTarget, amount);
for (var i = 0; i < Indices.Length; i++)
{
// Matrix applied to this vertex by its respective weight
var vertexMatrix = MatrixLerp(ref identity,
ref morphTarget,
Weights[i]);
var index = Indices[i];
// Applying the transformation from the base mesh vertex
// Additional calculations would be necessary if some regions overlap
meshResult.vertices[index]
= vertexMatrix.MultiplyPoint3x4(baseMesh.vertices[index] - Origin) + Origin;
}
}
public static Matrix4x4 MatrixLerp(ref Matrix4x4 from, ref Matrix4x4 to, float s)
{
var ret = new Matrix4x4();
for (var i = 0; i < 16; i++)
ret[i] = Mathf.Lerp(from[i], to[i], s);
return ret;
}
}
What you do beyond that is up to your imagination!