I think when a projectile is thrown it should have a burst of speed at the start and begin to rise slower as it reaches its peak height. Then as it starts to fall it should gradually begin to fall faster.
It's not possible to achieve a realistic-looking acceleration with the solution you're using.
The motion of an object traveling in an environment with gravity is often represented using a ballistic trajectory that ignores air resistance. Under such conditions, we can break the motion of the projectile into two components, the horizontal (x) velocity and the vertical (y) velocity. Physical forces will then change these velocity components over time.
If the projectile is unpowered and we ignore air resistance, the only force acting on the projectile mid-flight is the force of gravity, which will change only the y-component of the velocity. The x-component will remain constant.
You're calculating movement along a parabolic curve using a function which doesn't give you separate control over the X and Y axes. You can speed up or slow down movement along the curve, but this would affect movement along both the X-axis and Y-axis. This won't look right because it's not physically accurate.
You'd probably be better off giving up on bezier curves. You could use a ballistic equation (there are several implementations here), but it sounds like you want something that just looks nice and doesn't need to be super realistic.
Here's a script that moves a projectile from A to B along a parabolic curve. This script doesn't use actual physics; instead, we use a sine curve to add vertical motion to what would otherwise be a straight-line course from A to B. You can adjust the height of the arc and the duration of the animation. I've included a custom editor for previewing the parabola.
public class ParabolaAnimator : MonoBehaviour {
public IEnumerator FakeBallisticArc(Transform transform, Vector3 start, Vector3 end, float parabolaHeight, float duration) {
float elapsed = 0;
while (elapsed < duration) {
yield return null;
elapsed += Time.deltaTime;
float t = elapsed / duration;
transform.position = Evaluate(start, end, parabolaHeight, t);
}
}
public Vector3 Evaluate(Vector3 start, Vector3 end, float parabolaHeight, float t) {
t = Mathf.Clamp01(t);
Vector3 straightLinePoint = Vector3.Lerp(start, end, t);
float t2 = Mathf.Sin(t * Mathf.PI); // Curves from 0 to 1 and then back to 0
float extraHeight = parabolaHeight * t2;
return straightLinePoint + new Vector3(0, extraHeight, 0);
}
#if UNITY_EDITOR
[UnityEditor.CustomEditor(typeof(ParabolaAnimator))]
private class ParabolaAnimatorEditor : UnityEditor.Editor {
private Transform projectile;
private Vector3 start;
private Vector3 end;
private float parabolaHeight = 2;
private float duration = .75f;
private void Awake() {
var animator = target as ParabolaAnimator;
projectile = animator.transform;
}
private void OnEnable() {
var animator = target as ParabolaAnimator;
start = animator.transform.position + new Vector3(0, 1, 0);
end = animator.transform.position + new Vector3(0, 3, 5);
}
private void OnSceneGUI() {
Handles.color = Color.red;
UnityEditor.Handles.lighting = false;
start = UnityEditor.Handles.PositionHandle(start, Quaternion.identity);
UnityEditor.Handles.Label(start + Vector3.up, "Start");
end = UnityEditor.Handles.PositionHandle(end, Quaternion.identity);
UnityEditor.Handles.Label(end + Vector3.up, "End");
var animator = target as ParabolaAnimator;
Vector3 a, b;
float step = .05f;
for (float t = 0; t < 1; t += step) {
a = animator.Evaluate(start, end, parabolaHeight, t);
b = animator.Evaluate(start, end, parabolaHeight, t + step);
UnityEditor.Handles.DrawLine(a, b);
}
}
public override void OnInspectorGUI() {
base.OnInspectorGUI();
UnityEditor.EditorGUILayout.LabelField("Debug", UnityEditor.EditorStyles.boldLabel);
var animator = target as ParabolaAnimator;
start = UnityEditor.EditorGUILayout.Vector3Field("Start", start);
end = UnityEditor.EditorGUILayout.Vector3Field("End", end);
parabolaHeight = UnityEditor.EditorGUILayout.FloatField("Height", parabolaHeight);
parabolaHeight = Mathf.Max(parabolaHeight, 0);
if (Application.isPlaying) {
duration = UnityEditor.EditorGUILayout.FloatField("Duration", duration);
duration = Mathf.Max(duration, .1f);
projectile = UnityEditor.EditorGUILayout.ObjectField(projectile, typeof(Transform), true) as Transform;
GUI.enabled = (projectile != null);
if (GUILayout.Button("Test")) {
animator.StartCoroutine(animator.FakeBallisticArc(projectile, start, end, parabolaHeight, duration));
}
}
}
}
#endif
}

If you're not happy with the vertical motion, you can replace the sine curve in Evaluate()
with an Animation Curve or another formula.
This script does not check for obstacles along the trajectory, so if there is a risk of obstacles, you may need to write some additional code to check for obstacles (e.g. with raycasts) and update the trajectory settings accordingly.