実際やってみました。いろいろ適当なプログラムですが

#include <windows.h>
#include <stdio.h>

const int COUNT = 1000;
int main()
{
  HANDLE hHeap = GetProcessHeap();
  char* buff;
  unsigned int start, heap1 = 0, heap2 = 0, crt = 0;
  int i, j;
  
  for (j = 0; j < 100000; j++) {
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, 0, 100);
      HeapFree(hHeap, 0, buff);
    }
    heap1 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 100);
      HeapFree(hHeap, HEAP_NO_SERIALIZE, buff);
    }
    heap2 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = malloc(100);
      free(buff);
    }
    crt += timeGetTime() - start;
  }
  printf(" heap1: %d\n heap2: %d\n crt: %d\n", heap1, heap2, crt);
  return 0;
}

結果:
heap1: 27816
heap2: 29181
crt: 14736

結局malloc()よりHeapAlloc()の方が約1.9倍遅かったです。
謎なのはHEAP_NO_SERIALIZEをつけた方が遅いって事なんですが。。。ううむ